先前發文
DAY 01 : 參賽目的與規劃
DAY 02 : python3 virtualenv 建置
DAY 03 : python3 request
DAY 04 : 使用beautifulsoup4 和lxml
DAY 05 : select 和find 抓取tag
DAY 06 : soup解析後 list取值
DAY 07 : request_header_cookie 通過網頁18限制
DAY 08 : ppt內文爬取
DAY 09 : 資料處理 split replace strip
DAY 10 : python csv 寫入 和dict 合併
那現在先來針對寫入的功能進行介紹
開始前決定主題:
start_requests 看名子就知道 是一開始定義爬蟲的入口 , 那也可以在開始爬蟲前就先把csv的欄位先定義好
首先import csv
寫一個def 把csv 的header(欄位)定義好 , 然後用csv的方法寫入該檔案 , 每筆資料使用 ; 來分割 , 之後就把要爬的網站入口丟給home_page那支function
def start_requests(self)
header = ['firstpage', 'username', 'classname', 'category_pages', 'category_title', 'category_url', 'a_title', 'a_author', 'a_date', 'note_url', 'note']
with open ('ptt.csv','a',encoding='utf-8') as f:
csv_write = csv.DictWriter(f, fieldnames=header ,delimiter = ';')
csv_write.writeheader()
f.close()
for url in self.start_urls:
request_url = requests.get(url)
self.home_page(request_url)
那通過一連串的資料爬取與cookie帶入 , 資料dict的合併及dict資料打包 , 帶入其他function
那資料的dict合併 , 如下meta1的dict資料 與meta2的資料進行合併
meta_12 = dict(meta1.items() | meta2.items())
meta1 = {
"firstpage" : str(response.url),
"username" : str(username),
"classname" : str(classname),
"category_pages" : str(category_pages),
"category_title" : str(category_title),
"category_url" : str(category_url)
}
meta2 = {
"a_title" : str(a_title),
"a_author" : str(a_author),
"a_date" : str(a_date),
"note_url" : str(note_url),
"note" : str(note)
}
meta_12 = dict(meta1.items() | meta2.items())
self.insert_data(request_url, meta_12)
資料處理完後 , 就可以寫入剛剛欄位已經寫入的檔案了!!
def insert_data(self, response, meta_12):
soup = BeautifulSoup(response.text,'lxml')
checkpage = soup.title.text
if '404 Not Found' in checkpage:
pass
else:
meta_12["note"] = soup.select('#main-content')[0].text.split('※ 發信站')[0].replace('\n',' ')
header = ['firstpage', 'username', 'classname', 'category_pages', 'category_title', 'category_url', 'a_title', 'a_author', 'a_date', 'note_url', 'note']
with open ('ptt.csv','a',encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=header, delimiter = ';')
meta_12 = {key: value for key, value in meta_12.items()if key in header}
writer.writerow(meta_12)
唱歌唱歌!!
P!SCO-光圈